#pragma once

#include "Puntero.h"
#include "Iterable.h"
typedef unsigned int nat;

template <class T>
class ILista abstract : public Iterable<T>
{
public:
	virtual ~ILista(){}

	/* retorna la cantidad de elementos de la lista */
	virtual int Tamanio() const abstract;

	/* inserta el elemento x en la cabeza de la lista. La lista adminte elementos repetidos */
	virtual void InsertarAdelante(const T &x) abstract;

	/* inserta el elemento x en el final de la lista. La lista adminte elementos repetidos */
	virtual void InsertarAlFinal(const T &x) abstract;

	/* inserta el elemento x en la lista. La lista adminte elementos repetidos */
	virtual void InsertarOrdenado(const T &x) abstract;

	/* devuelve el primer elemento de la lista */
	/*Pre: la lista no es vacia*/
	virtual T ObtenerPrimerElemento() const abstract;

	/* devuelve el ultimo elemento de la lista */
	/*Pre: la lista no es vacia*/
	virtual T ObtenerUltimoElemento() const abstract;

	/* retorna true si la lista esta vacia */
	virtual bool EsVacia() const abstract;

	/* retorna true si el la lista esta llena */
	virtual bool EsLlena() const abstract;

	/* retorna true si x pertenece a la lista */
	virtual bool Pertenece(const T &x) const abstract;

	/* elimina el primer elemento de la lista */
	virtual void EliminarPrimerElemento() abstract;

	/* elimina el ultimo elemento de la lista */
	virtual void EliminarUltimoElemento() abstract;

	/* elimina todas ocurrencias del elemento x de la lista */
	virtual void EliminarElemento(T &x) abstract;

	/* obtiene el Iterador de los elementos existentes en la lista*/
	virtual Iterador<T> ObtenerIterador() const abstract;

	/* vacia la lista*/
	virtual void Vaciar() abstract;

};
